const obj = {
  data: {
    list: [{ name: '小明', age: 20 }, { name: '小李', age: 24 }]
  }
}
const obj2 = {
  data: {
    list: {}
  }
}
const res = obj?.data?.list.length // 2
console.log(res)
const res2 = obj2?.data?.list.length // undefined
console.log(res2)

// let res = obj?.data?.list
// <=等价=> let res = obj && obj.data && obj.data.list

// ?. 作用就是判断这个对象（obj）下的（data）下的（list）下的（length）是否为null或者undefined，当其中一链为null或者undefined时就返回undefined，这样即使中间缺少一个属性也不会报错，双问号后面接的就是默认值。

var obj3 = {}
console.log(obj3?.a?.b ?? 233) // 233
var obj4 = { a: { b: 1 } }
console.log(obj4?.a?.b ?? 233) // 1

console.log(1 || 'xx') // 1
console.log(0 || 'xx') // xx
console.log(null || 'xx') // xx
console.log(undefined || 'xx') // xx
console.log(-1 || 'xx') // -1
console.log('' || 'xx') // xx

console.log(1 ?? 'xx') // 1
console.log(0 ?? 'xx') // 0
console.log(null ?? 'xx') // xx
console.log(undefined ?? 'xx') // xx
console.log(-1 ?? 'xx') // -1
console.log('' ?? 'xx') // ''

// ?? 赋默认值  不过会忽略 0和空字符串等错误的值
